package cn.com.zzl.util;

import java.awt.image.BufferedImage;
import java.io.File;
import java.util.List;

import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;

import jp.sourceforge.qrcode.QRCodeDecoder;
import jp.sourceforge.qrcode.data.QRCodeImage;

import org.apache.commons.fileupload.disk.DiskFileItem;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.commons.CommonsMultipartFile;

/**
 * @description 二维码相关工具类（该工具类不错哦）
 * @author rambo
 * @date 2018年11月12日 上午9:38:38
 */
public class QRCodeUtil {
	
	/**
	 * @description 获取上传的二维码图片的text属性的值
	 * @param request 请求对象
	 * @param pictureName jsp图片name
	 * @return 返回上传的二维码图片的text属性的值（图片内容）
	 */
	public static String getPictureFileText(HttpServletRequest request, String pictureName) {
		MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
		List<MultipartFile>  multipartFiles = multipartRequest.getFiles(pictureName);
		MultipartFile multipartFile = multipartFiles.get(0);//仅考虑上传一张图片的情况
		String text = null;
		if (AssertUtil.isNotEmpty(multipartFile.getOriginalFilename())) {
			File file = multipartFileToFile(multipartFile);
			text = getText(file);
			if (text == null) {
				text = "";
			}
		}
		return text;//如果为null表示添加页面没有上传图片或者在修改页面没有修改图片，如果为空字符串""表示解析二维码图片失败
	}
	
	/**
	 * @description MultipartFile 转 File
	 * @param multipartFile
	 * @return
	 */
	public static File multipartFileToFile(MultipartFile multipartFile) {
		CommonsMultipartFile cf = (CommonsMultipartFile) multipartFile;
		DiskFileItem fi = (DiskFileItem) cf.getFileItem();
		//会在项目的根目录的临时文件夹下生成一个临时文件 *.tmp
		File file = fi.getStoreLocation();
		return file;
	}
	
	/**
	 * @description 解析二维码获取二维码中的text内容
	 * @param file 二维码图片文件对象
	 * @return 返回text内容
	 */
	public static String getText(File file) {
		String text = null;
        try {
        	//读取图片到缓冲区
            BufferedImage bufferedImage = ImageIO.read(file);
            
            //QRCode解码器
            QRCodeDecoder codeDecoder = new QRCodeDecoder();
        	
        	//通过解析二维码获得信息
            text = new String(codeDecoder.decode(new MyQRCodeImage(bufferedImage)), "utf-8");
		} catch (Exception e) {
			e.printStackTrace();
		}
        return text;
	}

}

/**
 * @description 实现QRCodeImage接口
 * @author rambo
 * @date 2018年11月12日 上午9:42:47
 */
class MyQRCodeImage implements QRCodeImage {
	
	BufferedImage bufferedImage;

    public MyQRCodeImage(BufferedImage bufferedImage){
        this.bufferedImage=bufferedImage;
    }

    //宽
    @Override
    public int getWidth() {
        return bufferedImage.getWidth();
    }

    //高
    @Override
    public int getHeight() {
        return bufferedImage.getHeight();
    }

    //像素还是颜色
    @Override
    public int getPixel(int i, int j) {
        return bufferedImage.getRGB(i,j);
    }

}

